package br.boicotando.server;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import br.boicotando.dominio.DadosCliente;


public class DadosClienteParser {
	private URL documento;


	public DadosClienteParser(URL url) throws IOException {
		documento = url;
	}

	private DadosCliente bindDadosCliente(NamedNodeMap attrs) {
		String attr;
		String value;
		DadosCliente dadosCliente = new DadosCliente();
		for (int i = 0; (i < attrs.getLength()); ++i) {
			attr = attrs.item(i).getNodeName();
			value = attrs.item(i).getNodeValue();
			if (attr.equals("id")) {
				dadosCliente.setId(value);
			} else if (attr.equals("nome")) {
				dadosCliente.setNome(value);
			} else if (attr.equals("sobre_nome")) {
				dadosCliente.setSobreNome(value);
			} else if (attr.equals("data_nascimento")) {
				dadosCliente.setDataNascimento(value);
			} else if (attr.equals("sexo")) {
				dadosCliente.setSexo(value);
			} else if (attr.equals("telefone_fixo_1")) {
				dadosCliente.setTelefoneFixo1(value);
			} else if (attr.equals("telefone_fixo_2")) {
				dadosCliente.setTelefoneFixo2(value);
			} else if (attr.equals("telefone_celular")) {
				dadosCliente.setTelefoneCelular(value);
			} else if (attr.equals("email")) {
				dadosCliente.setEmail(value);
			} else if (attr.equals("senha")) {
				dadosCliente.setSenha(value);
			} else if (attr.equals("cep")) {
				dadosCliente.setCep(value);
			} else if (attr.equals("endereco")) {
				dadosCliente.setEndereco(value);
			} else if (attr.equals("numero")) {
				dadosCliente.setNumero(value);
			} else if (attr.equals("complemento")) {
				dadosCliente.setComplemento(value);
			} else if (attr.equals("bairro")) {
				dadosCliente.setBairro(value);
			} else if (attr.equals("cidade")) {
				dadosCliente.setCidade(value);
			} else if (attr.equals("estado")) {
				dadosCliente.setEstado(value);
			}
		}
		return dadosCliente;
	}

	private void bind( List<DadosCliente> envioDadosCliente, Node node) {
		int type = node.getNodeType();
		switch (type) {
			case Node.DOCUMENT_NODE: {
				bind(envioDadosCliente, ((Document) node).getDocumentElement());
				break;
			}
			case Node.ELEMENT_NODE: {
				NamedNodeMap attrs = node.getAttributes();
				if (node.getNodeName().equals("cliente")) {
					DadosCliente dadosCliente = bindDadosCliente(attrs);
					envioDadosCliente.add(dadosCliente);
				}
				if (node.hasChildNodes()) {
					NodeList children = node.getChildNodes();
					for (int i = 0; i < children.getLength(); i++) {
						bind(envioDadosCliente, children.item(i));
					}
				}
				break;
			}
		}
	}

	public List<DadosCliente> parse() throws Exception {
		List<DadosCliente> dadosCliente = new ArrayList<DadosCliente>();
		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
		docBuilderFactory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
		Document doc = docBuilder.parse(documento.openConnection().getInputStream());
		bind(dadosCliente, doc);
		return dadosCliente;
	}
}
